package com.sbm.util;

import java.lang.reflect.Type;

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
import com.google.gson.reflect.TypeToken;

public class JsonUtil {

    /** disableHtmlEscaping 是为了在发送消息时不将 & = 等特殊字符转码   */
    private static final Gson mGson = new GsonBuilder().disableHtmlEscaping().setDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ").create();

    public static Gson getGson() {
        return mGson;
    }

       /**
     * 转换成Json对象。推荐这种方式，处理数字等各类型更方便。
     * http://www.programcreek.com/java-api-examples/com.google.gson.JsonParser
     * @param json
     * @return
     */
    public static JsonObject getJsonObject(String json) {
        JsonParser parser = new JsonParser();
        JsonElement element = parser.parse(json);
        if(element.isJsonObject()) {
            return element.getAsJsonObject();
        }
        return null;
    }

    /**
     * 从json转换成Map，对于 3 这样的数字，也会转换成 "3" ，不会变成 "3.0"。
     * @param json
     * @return
     */
    public static java.util.Map<String, String> getMap(String json) {
        Gson gson = new Gson();
        Type stringMap = new TypeToken<java.util.Map<String, String>>(){}.getType();
        java.util.Map<String, String> map = gson.fromJson(json, stringMap);
        return map;
    }

    /**
     * 从json转换成Map, 据说可以应对 Map<Sting, Enum> 的情况。
     * @param json
     * @return
     */
    public static java.util.Map<String, Object> getMapObject(String json) {
        Gson gson = new Gson();
        Type stringMap = new TypeToken<java.util.Map<String, Object>>(){}.getType();
        java.util.Map<String, Object> map = gson.fromJson(json, stringMap);
        return map;
    }

    public static JsonArray getJsonArray(String json) {
        JsonParser parser = new JsonParser();
        JsonElement element = parser.parse(json);
        if(element.isJsonArray()) {
            return element.getAsJsonArray();
        }
        return null;
    }
}
